package 行为型模式

import java.util.*


/**
 * 提供一种方法顺序访问一个聚合对象中的各个元素，而又不需要暴露该对象的内部表示
 */

class ReverseArrayCollection<T : Any>(vararg objs: T) : Iterable<T> {
    private var array: Array<T> = objs.copyOfRange(0, objs.size) as Array<T>

    override fun iterator(): Iterator<T> {
        return ReverseIterator()
    }

    inner class ReverseIterator : Iterator<T> {
        // 索引位置:
        private var index: Int = this@ReverseArrayCollection.array.size

        override fun hasNext(): Boolean {
            // 如果索引大于0,那么可以移动到下一个元素(倒序往前移动):
            return index > 0
        }

        override fun next(): T {
            // 将索引移动到下一个元素并返回(倒序往前移动):
            index--
            return array[index]
        }
    }
}


fun main(args: Array<String>) {
    for (i in ReverseArrayCollection(1, 2, 3)) {
        println(i)
    }
}